package proceso.carga.sector;


import hibernate.HibernateUtil;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.StringTokenizer;

import org.hibernate.Session;

import modelo.poligonal.Poligonal;
import modelo.regionRiego.RegionRiego;
import modelo.serieterreno.SerieTerreno;

/**
 * 
 * @author edgar
 * Carga tipos de terreno para una region.
 * tiene una estructura similar a la carga de regiones de riego.
 * Archivos de entrada .bln
 */

public class CargaSerieTerreno {

	private List<SerieTerreno> listaSerie = new ArrayList<SerieTerreno>();
	private String error;
	private String nombre;
	private RegionRiego region;

	public RegionRiego getRegion() {
		return region;
	}
	public void setRegion(RegionRiego region) {
		this.region = region;
	}
	public List<SerieTerreno> getListaSerie() {
		return listaSerie;
	}
	public void setListaSerie(List<SerieTerreno> listaSerie) {
		this.listaSerie = listaSerie;
	}
	public String getError() {
		return error;
	}
	public void setError(String error) {
		this.error = error;
	}
	public String getNombre() {
		return nombre;
	}
	public void setNombre(String nombre) {
		this.nombre = nombre;
	}
	
	public boolean cargar(String nombreArchivo, String directorio, RegionRiego region, Session sess){
		File arch;
		FileReader lectorArch;
		BufferedReader lectorBuffer;
		StringTokenizer tokens;
		String nombreArchSerie;
		String nombreRegion;
		String nombreSerie;
		List<String> listaCaracteristica;
		String linea;
		int contArchivos;
		int arcNro = 0;
		boolean resultado;
		arch = new File(nombreArchivo);
		try {
			lectorArch = new FileReader(arch);
			lectorBuffer = new BufferedReader(lectorArch);
			linea = lectorBuffer.readLine();
			tokens = new StringTokenizer(linea,",");
			nombreRegion = tokens.nextToken();			
			contArchivos = Integer.parseInt(tokens.nextToken().trim());
			
			while(lectorBuffer.ready()){
				linea = lectorBuffer.readLine();
				tokens = new StringTokenizer(linea,",");
				nombreArchSerie = directorio+"/"+tokens.nextToken();
				nombreSerie = tokens.nextToken();
				listaCaracteristica = new ArrayList<String>();
				while(tokens.hasMoreElements()){
					listaCaracteristica.add(tokens.nextToken().trim());
				}
				System.out.println("archivo " + arcNro +nombreArchSerie + " sector: " + nombreSerie);
				for(int i=0; i<listaCaracteristica.size(); i++){
					System.out.println("car. " + i +" " + listaCaracteristica.get(i));
				}
				arcNro++;
				LectorPoligonal lector = new LectorPoligonal();
				resultado = lector.leer(nombreArchSerie);
				if(resultado){
					SerieTerreno serie = new SerieTerreno();
					serie.iniciarListaPoligonal();
					serie.setNombreDeLaSerie(nombreSerie);
					for(int i=0; i<lector.getListaPoligonal().size(); i++){
						serie.agregarPoligonal(lector.getListaPoligonal().get(i));
						lector.getListaPoligonal().get(i).setSerieTerreno(serie);
					}
					// convertir las caracteristicas en valores
					serie.setCodigo(nombreSerie.substring(0, 1));
					serie.setDescripcion(listaCaracteristica.get(0));
					serie.setArea(Float.parseFloat(listaCaracteristica.get(1)));
					serie.setUnidadCartografica(listaCaracteristica.get(2));
					serie.setTaxonomia(listaCaracteristica.get(3));
					serie.setDescripcionPerfil(listaCaracteristica.get(4));
					serie.setpH(Float.parseFloat(listaCaracteristica.get(5)));
					serie.setInfiltracionBasica(Float.parseFloat(listaCaracteristica.get(6)));
					serie.setConductividadElectrica(Float.parseFloat(listaCaracteristica.get(7)));
					serie.setNutrientes(listaCaracteristica.get(8));
					listaSerie.add(serie);
					serie.setRegion(region);
					region.agregarSerie(serie);
				}
				else {
					error += "No se cargo la serie corresondiente a " + nombreSerie +"\n";
				}
			}
			for(int i=0; i<listaSerie.size();i++){
				sess.save(listaSerie.get(i));
				sess.flush();
				sess.clear();
			}
			sess.update(region);
		} catch (FileNotFoundException e) {
			error = "El archivo no existe en la direccion dada";
			e.printStackTrace();
			return false;
		} catch (IOException e) {
			error = "Error en la lectura del archivo";
			e.printStackTrace();
			return false;
		}
		if(arcNro != contArchivos) {
			error += "el nro de archivos es distinto al especificado";
			return false;
		}		
		return true;
	}
}
